import 'dart:io';

import 'package:base_flutter/base_flutter.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bmflocation/flutter_bmflocation.dart';
import 'package:ls_work/config/permission_center_config.dart';
import 'package:permission_handler/permission_handler.dart';

typedef OnLocationResultListener = Function(BaiduLocation result);

class LocationConfig {
  static LocationConfig? _instance = null;

  static LocationConfig get instance => _instance ??= LocationConfig._();

  LocationFlutterPlugin myLocPlugin = LocationFlutterPlugin();

  List<OnLocationResultListener> listeners = [];

  BaiduLocation? lastLocation;

  bool hasPreInit = false;

  void addListener(OnLocationResultListener listener) {
    listeners.add(listener);
  }

  void removeListener(OnLocationResultListener listener) {
    listeners.remove(listener);
  }

  LocationConfig._() {
    myLocPlugin.setAgreePrivacy(true);

    if (Platform.isIOS) {
      myLocPlugin.authAK('7j7pdgv2w1qPA06RwIv2jhMkJFu7ViNk');
    }



    myLocPlugin.seriesLocationCallback(callback: (BaiduLocation result) {
      //result为定位结果
      lastLocation = result;
      print("定位结果：${result.address}");
      print("listenersList：${listeners.length}");
      for (var listener in listeners) {
        listener(result);
      }
    });

  }

  Future<void> preInit() async {
    if(hasPreInit){
      return;
    }
    Map iosMap = initIOSOptions().getMap();
    Map androidMap = initAndroidOptions().getMap();

    var _suc = await myLocPlugin.prepareLoc(androidMap, iosMap);
    hasPreInit = _suc;
  }

  Future<void> startLocation(BuildContext context) async {
   await Permission.location.checkRequestPermission(context, onSuccess: () async {
     if(lastLocation!=null){
       for(var listener in listeners){
         listener(lastLocation!);
       }
     }
     await myLocPlugin.startLocation();
     debugPrint("开始定位======>");
    },msg: "开始或者完成服务工单，需要获取您的定位权限");
  }

  BaiduLocationAndroidOption initAndroidOptions() {
    BaiduLocationAndroidOption options = BaiduLocationAndroidOption(
// 定位模式，可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        locationMode: BMFLocationMode.hightAccuracy,
// 是否需要返回地址信息
        isNeedAddress: true,
// 是否需要返回海拔高度信息
        isNeedAltitude: false,
// 是否需要返回周边poi信息
        isNeedLocationPoiList: true,
// 是否需要返回新版本rgc信息
        isNeedNewVersionRgc: true,
// 是否需要返回位置描述信息
        isNeedLocationDescribe: true,
// 是否使用gps
        openGps: true,
// 可选，设置场景定位参数，包括签到场景、运动场景、出行场景
        locationPurpose: BMFLocationPurpose.signIn,
// 坐标系
        coordType: BMFLocationCoordType.bd09ll,
// 设置发起定位请求的间隔，int类型，单位ms
// 如果设置为0，则代表单次定位，即仅定位一次，默认为0
        scanspan: 2000);
    return options;
  }

  BaiduLocationIOSOption initIOSOptions() {
    BaiduLocationIOSOption options = BaiduLocationIOSOption(
      // 坐标系
      coordType: BMFLocationCoordType.bd09ll,
      // 位置获取超时时间
      locationTimeout: 10,
      // 获取地址信息超时时间
      reGeocodeTimeout: 10,
      // 应用位置类型 默认为automotiveNavigation
      activityType: BMFActivityType.automotiveNavigation,
      // 设置预期精度参数 默认为best
      desiredAccuracy: BMFDesiredAccuracy.best,
      // 是否需要最新版本rgc数据
      isNeedNewVersionRgc: true,
      // 指定定位是否会被系统自动暂停
      pausesLocationUpdatesAutomatically: false,
      // 指定是否允许后台定位,
      // 允许的话是可以进行后台定位的，但需要项目配置允许后台定位，否则会报错，具体参考开发文档
      allowsBackgroundLocationUpdates: false,
      // 设定定位的最小更新距离
      distanceFilter: 10,
    );
    return options;
  }

  void stop(){
    myLocPlugin.stopLocation();
  }


}
